home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / src / stefanb_src.lha / UMS / Developer / doc / english / ums.doc next >
Encoding:
Text File  |  1995-05-13  |  76.9 KB  |  2,086 lines

  1. TABLE OF CONTENTS
  2.  
  3. ums.library/--background--
  4. ums.library/--loginguide--
  5. ums.library/--message-format--
  6. ums.library/--attributes--
  7. ums.library/UMSCannotExport
  8. ums.library/UMSDeleteMsg
  9. ums.library/UMSDupAccount
  10. ums.library/UMSErrNum
  11. ums.library/UMSErrTxt
  12. ums.library/UMSErrTxtFromNum
  13. ums.library/UMSExportedMsg
  14. ums.library/UMSFreeConfig
  15. ums.library/UMSFreeMsg
  16. ums.library/UMSLog
  17. ums.library/UMSLogin
  18. ums.library/UMSLogout
  19. ums.library/UMSMatchConfig
  20. ums.library/UMSReadConfig
  21. ums.library/UMSReadMsg
  22. ums.library/UMSRLogin
  23. ums.library/UMSSearch
  24. ums.library/UMSSelect
  25. ums.library/UMSServerControl
  26. ums.library/UMSWriteConfig
  27. ums.library/UMSWriteMsg
  28. ums.library/--background--                         ums.library/--background--
  29.  
  30.    $VER: 11.27 (12-May-95)
  31.  
  32.  
  33.    COPYRIGHT
  34.          This document is (C) 1992-1995 by
  35.        Martin Horneffer, Olaf Peters, Christoph Viethen, and ???
  36.  
  37.          It may freely be copied and distributed, as long as the text is
  38.        unchanged and this copyright notice is left intact.
  39.  
  40.    GENERAL
  41.          UMS stands for "Universal Message System".
  42.  
  43.          This  means  that  UMS  allows  to  treat  and read all kinds of
  44.        messages  ('e-mail'  and 'news') as universally and efficiently as
  45.        possible.
  46.  
  47.          The  user  should  not need to care about what network a message
  48.        comes  from  or goes to/through and what format is used, he or she
  49.        should be able to concentrate totally on the messages' contents.
  50.  
  51.          In order to achieve this goal, UMS does two things:
  52.  
  53.          1) define an universal format for messages where messages in all
  54.        formats  and  from  all  networks can be stored in without loss of
  55.        information and nevertheless being randomly interchangeable.
  56.  
  57.          This  universal  message format is described in this document in
  58.        section "--message-format--".
  59.  
  60.          2) implement  a central, network-independent database-mamagement
  61.        that  allows to store and read/retrieve messages in the UMS format
  62.        as efficiently as possible.
  63.  
  64.          The  implementation  of  the  Message  Base Processor ('MBP') is
  65.        based  on  the server/client- concept.  Clients address the server
  66.        to  get  or  put  messages.   The  server  manages the storage and
  67.        retrieval   of   messages  and  controls  the  different  client's
  68.        access-rights  to the system.  The common interface between client
  69.        and server is a set of functions described in this document.
  70.  
  71.          Clients are
  72.          -  simple  USERS  that  read  and write messages (using programs
  73.        called 'newsreaders'),
  74.          -  a  special  kind  of  user, the 'SYSOP', which has additional
  75.        rights and tools to manage the system,
  76.          -  IMPORTERS,  that get messages form other systems and put them
  77.        into the local system after converting them to the UMS format, and
  78.          -  EXPORTERS,  that  look for all NEW messages in the system and
  79.        send them to other systems after converting them into the specific
  80.        format.
  81.  
  82.          The  MBP  controls  which user may read what message and, in the
  83.        same  way, which exporter needs to export or forward what message.
  84.        It  cares  about whether a message can or cannot be correctly sent
  85.        to its destination.
  86.          The  MBP  also  performs  dupe-checking  and  reply-chaining  on
  87.        Message-IDs.
  88.  
  89.    TAGS
  90.          UMS extensively uses AmigaDOS-style tags (see: utility.library).
  91.        In addition to the AmigaDOS standard, UMS uses some bit-masking in
  92.        the types of tags:
  93.  
  94.          if  bit 13 is set (tag & 0x2000), the tag data is a STRPTR, i.e.
  95.        a pointer to a null-terminated string.
  96.  
  97.          if  bit  14 is set (tag & 0x4000), the tag is considered a 'var-
  98.        parameter'  (e.g.  LONG *).  I.e.  the tag.data entry must contain
  99.        a  pointer  to  the  real  data,  which will be set/changed by the
  100.        called function.
  101.  
  102.          if both bits 13 and 14 are set ((tag & 0x6000)==0x6000), the tag
  103.        is a pointer to a string pointer which will be set/changed (STRPTR
  104.        *).
  105.  
  106.          if none of these bits is set, the data in most cases is a simple
  107.        integer parameter (e.g. LONG or LONGBITS). Exceptions are possible
  108.        and explicitly mentioned.
  109.  
  110. ums.library/--loginguide--
  111.  
  112.    PURPOSE
  113.        Guidelines on a uniform login-procedure in UMS-applications
  114.  
  115.    NOTE
  116.          Suggestions  concerning  this  section of the document should be
  117.        directed to Olaf Peters <op@hb2.maus.de>
  118.  
  119.    GENERAL
  120.          Shell- & Workbench-startup
  121.  
  122.          An  application  should  take  into  account  the  command  line
  123.        arguments   (Shell)   respectively   Workbench  tooltypes  'NAME',
  124.        'PASSWORD'  and  'SERVER'. Concerning invokation from a Shell, the
  125.        order  of  arguments  should  match  above  example, with 'SERVER'
  126.        declared  a  keyword  (resulting  in  a command template beginning
  127.        "NAME,PASSWORD,SERVER/K[,...]").
  128.  
  129.    SHELL
  130.          Invocation from Shell:
  131.  
  132.          If the application is passed a questionmark as the only argument
  133.        on  the  command  line  (i.e.  'UMSapp  ?'),  it should return the
  134.        template  to  stdout and offer a prompt to have the user enter the
  135.        desired  options.  The  user  should be able to request additional
  136.        help  by  responding  to  the  prompt  with  another questionmark.
  137.        Additional help consists of complete version information (at least
  138.        a  standard version template as specified in "Amiga User Interface
  139.        Styleguide" (pp. 110)) accompanied by short help information.
  140.  
  141.          Technical  realisation: DOS.ReadArgs() provides a standard means
  142.        to  parsing  the  command  line  and  behaves exactly in the above
  143.        described  manner  (it  should therefore be used). Additional help
  144.        text  can  be  passed  to  ReadArgs() by supplying a custom RDArgs
  145.        structure  as  third  argument  which  holds a pointer to the text
  146.        string  in RDA_ExtHelp. Refer to "The AmigaDOS Manual", Chapter 5,
  147.        Basic  Input and Output Programming, Standard Command Line Parsing
  148.        (pp. 181 as of the 3rd edition)
  149.  
  150.    GUI
  151.          Applications allowing login via GUI (graphical user interface):
  152.  
  153.          If  'NAME'  is not specified at startup time, it must be entered
  154.        to the login window. Activate the name object.
  155.  
  156.          It  is  legal  to  pass an empty 'PASSWORD' as long as a name is
  157.        specified.  Thus  the  empty password must attempt a login! If the
  158.        user  passes  the period (".") as 'PASSWORD', she desires to enter
  159.        her password to the login window. It should open with the password
  160.        object activated.
  161.  
  162.          If  there  is no 'SERVER' specified and the login window must be
  163.        opened  due  to  the above guidelines, the server object should be
  164.        filled  with  the  name  of the default server (i.e. the server to
  165.        which the user would be going to log in to if she was not naming a
  166.        different one herself). The default server's name can be read from
  167.        the ENV $UMSSERVER. If the ENV does not exist, the default name is
  168.        "default". :-)
  169.  
  170.          A  failed  GUI  login  should  be answered in a requester. After
  171.        confirmation  the  user  should  be  presented with the unmodified
  172.        login  window again as to correct her wrong inputs. Cancelling the
  173.        requester should result in terminating the application.
  174.  
  175. ums.library/--message-format--                 ums.library/--message-format--
  176.  
  177.    NAME
  178.        UMS Message Format -- the universal format of UMS messages
  179.  
  180.    NOTE
  181.          Suggestions  concerning  this  section of the document should be
  182.        directed to Christoph Viethen <cv@nostlgic.oche.de>.
  183.  
  184.    GENERAL
  185.          A message in the UMS message base is always defined by a list of
  186.        tags.  This  allows  for  easy extension as new tags may always be
  187.        defined later on.
  188.  
  189.          In one UMS message, each tag may occur only once.
  190.  
  191.    TEXT TAGS
  192.          The  first  part  of  this  section  describes the format of the
  193.        currently  defined  TEXT-tags.  Currently  these  tags include all
  194.        information  that is site-independend and needed when transferring
  195.        messages between different systems.
  196.  
  197.          Except when explicitly stated otherwise, these tags are network-
  198.        independent.  Drivers  for  all  networks  can and must understand
  199.        them.
  200.  
  201.          A text-tag specifies a null-terminated string of any length. All
  202.        ASCII-characters  are allowed. Unless something else is documented
  203.        for  a specific tag, the standard Amiga charset (ISO 8859 Latin 1)
  204.        is used for 8-bit characters.
  205.  
  206.          Some of the text-tags are required for every message, others are
  207.        optional.
  208.  
  209.  
  210.      0. UMSCODE_MsgText
  211.  
  212.          This  contains  the main 'text' of a message. Every message must
  213.        have this tag as it is usually the main information transported by
  214.        a message.
  215.  
  216.          Any  information  that does not belong to the original text must
  217.        not  be  put  here.  Even  when  a  gateway  between two different
  218.        networks puts information in the text, an UMS importer should - if
  219.        possible  - extract this information and use or store it somewhere
  220.        else.
  221.  
  222.          The text may be of any size, even empty.
  223.  
  224.          By  using  the global ums.config item "Maxmsgsize" you can set a
  225.        size  limit.  Attempting to _write_ messages larger than this into
  226.        the  message  base will fail. (This limit does not affect the size
  227.        of  messages  already  in  the  message base. If you, say, write a
  228.        message  of  500K  into the MB and then set "Maxmsgsize" to 300000
  229.        (bytes), there shouldn't be any problems when making read accesses
  230.        to this message.)
  231.  
  232.          Since  some  networks  limit messages to a certain size, drivers
  233.        for these networks must be able to cope with this situation.
  234.  
  235.          Lines  are  delimited  by the standard line delimiter (LF in the
  236.        current  UMS implementation), no matter, what network the specific
  237.        messages  originate from and what kind of line delimiters are used
  238.        there.
  239.  
  240.          Lines  may  be  of  any  length, so it's up to the newsreader or
  241.        exporter to wrap lines if needed.
  242.  
  243.  
  244.      1. UMSCODE_FromName
  245.  
  246.          This is the name of the message's author. It's only the name and
  247.        NOT the address. This should be the REALNAME!
  248.  
  249.          If  there is no realname, the username must be used or extracted
  250.        from the author's address.
  251.  
  252.          Every message must have this tag.
  253.  
  254.  
  255.      2. UMSCODE_FromAddress
  256.  
  257.          This  is  the author's net-address. The name needn't redundantly
  258.        be repeated in this field, if it's already in UMSCODE_FromName.
  259.  
  260.          This  tag must be empty or the tag must not be specified, if the
  261.        author  is  located on the local system. In every other case, this
  262.        tag is mandatory.
  263.  
  264.          Whenever possible, the address should be the user's real address
  265.        and  not an encapsulated address or the address of a gateway. Thus
  266.        it may be necessary for importers to convert received addresses to
  267.        another  network's format. The corresponding exporters, of course,
  268.        have  to be able to re-convert these addresses. This makes the use
  269.        of  gateways  transparent to the user - one of UMS' most important
  270.        features.  It  saves  the user from having to know and worry about
  271.        the formats of all the gateways himself.
  272.  
  273.          Since  there  are  different  networks with different formats of
  274.        addresses, it's neccessary to distinguish these different formats.
  275.        This  is  done  by  looking  at  the  "tail"  of  the address. The
  276.        following formats are currently known:
  277.  
  278.  
  279.           Identifier                          : network/format
  280.           ----------------------------------------------------
  281.           "@Fidonet"                          : FidoNet
  282.           ".maus"                             : MausNet
  283.           ".org", ".edu", ".UUCP", ".net",
  284.           ".de", .. [any valid usenet domain] : RFC
  285.           "@BIX"                              : BIX
  286.           "@Portal"                           : Portal
  287.  
  288.  
  289.        Important note:
  290.  
  291.           Under certain circumstances, other identifiers may be used:
  292.  
  293.           1) Small networks: Quite a few of them use adresses which
  294.           look like FidoNet-Adresses, but contain a different "zone
  295.           number". For practical reasons, messages from such networks
  296.           may be imported into the UMS message base using an identifier
  297.           other than "@Fidonet". So you may encounter addresses like e.g.
  298.           "21:100/1.0@Gernet" in the MB.
  299.  
  300.           2) There are special-purpose applications, like e.g. QWK im-/
  301.           exporters(?), which could use other kinds of identifiers not
  302.           contained in the above table.
  303.  
  304.  
  305.          So  programmers of UMS applications should keep the following in
  306.        mind:
  307.  
  308.          Any UMS tool should be programmed in such a way that it does not
  309.        break if it encounters unknown network identifiers and/or formats.
  310.        In such cases, it should inform the user of the problem and behave
  311.        "neutrally", e.g. ignore the problematic message. UMS tools should
  312.        never  rely  on  somewhat  adventurous  "address  format guessing"
  313.        methods.
  314.  
  315.          On  the other hand, if you plan to write a tool that will import
  316.        messages  into  the  MB with address formats different to the ones
  317.        mentioned  in  the  above  table,  you  are  _strongly_ advised to
  318.        contact   authors   of  other  UMS  applications,  especially  the
  319.        developers   of   the   UMS   im-/exporters,  in  order  to  avoid
  320.        incompatibility problems right from the start.
  321.  
  322.  
  323.        Examples:
  324.  
  325.           a) Fidonet          2:2452/107.9@Fidonet
  326.                               2:242/53@Fidonet
  327.  
  328.           b) MausNet          AC2.maus
  329.                               MS.maus
  330.                               MK2.maus
  331.                               M.maus
  332.  
  333.           c) RFC              maho@dfv.rwth-aachen.de
  334.                               marvin@tornado.oche.de
  335.                               in-info@individual.net
  336.                               postmaster@germany.uucp
  337.                               peterk@cbmger.de.so.commodore.com
  338.  
  339.  
  340.          Network-identifiers  are  NOT  case-sensitive. Nevertheless, you
  341.        always  should  preserve  case,  as  it  might  be  needed by some
  342.        networks.
  343.  
  344.  
  345.        Historical note:
  346.  
  347.           Some time ago, a special address format was used in the
  348.           german "Z-Netz", and its identifier was ".zer". That format
  349.           had a number of limitations and disadvantages, so a new
  350.           mail format called "ZConnect" was developed and now should
  351.           be used by all Z-Netz members. This new format no longer
  352.           needs any special address identifiers since it uses real RFC
  353.           addresses.
  354.           So the identifier ".zer" mentioned in the V10 version of
  355.           this documentation shouldn't be treated in a special way
  356.           by programs using ums.library any more.
  357.  
  358.  
  359.        Some examples for splitting addresses for 'Name' and 'Address':
  360.  
  361.  
  362.        RFC:
  363.  
  364.           "Martin Horneffer <maho@umshq.dfv.rwth-aachen.de>"
  365.           -> name: "Martin Horneffer"
  366.              address: "maho@umshq.dfv.rwth-aachen.de"
  367.  
  368.           "horneff@pool.informatik.rwth-aachen.de (Martin Horneffer)"
  369.           -> name: "Martin Horneffer"
  370.              address: "horneff@pool.informatik.rwth-aachen.de"
  371.  
  372.           "horneff@pool.informatik.rwth-aachen.de"
  373.           -> name: "horneff"
  374.              address: "horneff@pool.informatik.rwth-aachen.de"
  375.  
  376.  
  377.        FidoNet:
  378.  
  379.           "Martin Horneffer at 2:242/7.9"
  380.           -> name: "Martin Horneffer"
  381.              address: "2:242/7.9@Fidonet"
  382.  
  383.           "Joerg Gutzke at 2:242/7"
  384.           -> name: "Joerg Gutzke"
  385.              address: "2:242/7@Fidonet"
  386.  
  387.  
  388.      3. UMSCODE_ToName
  389.  
  390.          Name of the person the message is addressed to.
  391.  
  392.          Must  be  specified  in  all  private messages ("e-mail") and is
  393.        optional in public messages ("news").
  394.  
  395.  
  396.      4. UMSCODE_ToAddress
  397.  
  398.          The addressed person's network address.
  399.  
  400.          Needed  in  private  messages if the message has not yet reached
  401.        its  destination. Must not be used when the mail is addressed to a
  402.        user on the local system.
  403.  
  404.          UMSCODE_ToName  and  UMSCODE_ToAddress  have  exactly  the  same
  405.        format as UMSCODE_FromName and UMSCODE_FromAddress.
  406.  
  407.          It  should  always  be  possible to reply to a private or public
  408.        message  by  using it's FromName and FromAddress as the new ToName
  409.        and ToAddress.
  410.  
  411.  
  412.      5. UMSCODE_MsgID
  413.  
  414.          A  unique  message  ID  in  RFC-format.  This  is valid also for
  415.        non-RFC networks like FidoNet or MausNet!
  416.  
  417.          Every  message  must  have  such  an  ID. If there's no ID for a
  418.        message, the message base processor will create a new one for this
  419.        message. Never create message IDs on your own!
  420.  
  421.          Some  example  message  ID's,  just to give you an idea what IDs
  422.        from RFC and non-RFC systems may look like within UMS:
  423.  
  424.  
  425.        2pocc6$qf2@Germany.EU.net
  426.        295@lyssa.owl.de                       (generated by RFC systems)
  427.  
  428.        91102312@p27.f107.n2452.z2.fidonet.org (generated by a Fido "point")
  429.        51515153@f7.n242.z2.fidonet.org        (generated by a  "non-point")
  430.  
  431.        199409281223.a27374@hro.maus.de        (generated in MausNet)
  432.  
  433.  
  434.      6. UMSCODE_CreationDate
  435.  
  436.          (Optional)  date  of  creation,  i.e.  when the message has been
  437.        written  by  the  user.  May  be in any format that is readable by
  438.        humans. AmigaDOS format (dd-mmm-yy hh:mm:ss) preferred.
  439.  
  440.          If not set, then the message base processor will use the current
  441.        date to create a date string in AmigaDOS format.
  442.  
  443.  
  444.      7. UMSCODE_ReceiveDate
  445.  
  446.          Obsolete.  Don't  use  any more! As a replacement there is a tag
  447.        for a site-specific binary date.
  448.  
  449.  
  450.      8. UMSCODE_ReferID
  451.  
  452.          (Optional)  message  ID  of  the  most  recent  message  that is
  453.        referred to by the current message. Same format as 'MsgID'.
  454.  
  455.  
  456.      9. UMSCODE_Group
  457.  
  458.          Name of the message's newsgroup.
  459.  
  460.          Must  be  used  for  public  messages only. Must not be used for
  461.        private  mail. This tag is the only one that distinguishes private
  462.        from public messages.
  463.  
  464.          To  avoid  possible  conflicts,  the name of the network must be
  465.        prepended  for  non-usenet  groupnames.  Usenet  groupnames, which
  466.        already are hierarchically ordered, stay as they are.
  467.  
  468.          E.g. "fidonet.AMIGA", "maus.ac.amiga", "comp.sys.amiga.misc".
  469.  
  470.          Only  one  group  may be used in this field! Use 'Hardlinks' for
  471.        "crosspostings".
  472.  
  473.  
  474.      10. UMSCODE_Subject
  475.  
  476.          The (short) subject of the message. Required.
  477.  
  478.  
  479.      11. UMSCODE_Attributes
  480.  
  481.          (Optional) List of keywords. See ums.library/--attributes--
  482.  
  483.  
  484.      12. UMSCODE_Comments
  485.  
  486.          (Optional)  all  "header-"information,  that belong to a message
  487.        and must be preserved, but don't fit to another text-tag. E.g. all
  488.        unknown RFC-header lines go here.
  489.  
  490.          The  first  line should specify the name of networks the message
  491.        comes from and the name (and perhaps version) of the importer.
  492.  
  493.  
  494.      13. UMSCODE_Organization
  495.  
  496.          (Optional) sender's organization or, in FidoNet, "Origin".
  497.  
  498.  
  499.      14. UMSCODE_Distribution
  500.  
  501.          (Optional)  where/what  the message should be distributed to/by.
  502.        Much like RFC-"Distribution:".
  503.  
  504.          Could  e.g.  be  used to select which UMS-Exporter should export
  505.        the respective message if the ums.config is set accordingly.
  506.  
  507.  
  508.      15. UMSCODE_Folder
  509.  
  510.          (Written  by receiver) The receiver of a private message may use
  511.        this  field  to  store  a  short  label in (not more than about 30
  512.        chars,  not  more  than  one  line). This allows him to categorize
  513.        received  messages. Newsreaders may allow to change that field for
  514.        private  messages  and  then  to use these categories or 'folders'
  515.        like 'groups' in public messages.
  516.  
  517.  
  518.      16. UMSCODE_FidoID
  519.  
  520.          This is specific to FidoNet.
  521.  
  522.          It  should  thus  be  ignored  by  all programs not specifically
  523.        dealing  with  FidoNet.  It's  used to keep the internal "^aMSGID"
  524.        used  within  FidoNet  if  it cannot be converted to 'MsgID'. This
  525.        only applies to messages that came from other networks and went to
  526.        FidoNet through some gateway.
  527.  
  528.  
  529.      17. UMSCODE_MausID
  530.  
  531.          This is specific to MausNet.
  532.  
  533.          It  should  thus  be  ignored  by  all programs not specifically
  534.        dealing  with MausNet. It's used to store the internal MausNet-ID.
  535.        It  will  become  superfluous when MausNet software learns to deal
  536.        with real Message-IDs.
  537.  
  538.  
  539.      18. UMSCODE_ReplyGroup
  540.  
  541.          (Optional)  name  of  the  group  public  replies ("follow-ups")
  542.        should go to. Ergo: Same purpose as "Followup-To:" in RFC1036.
  543.  
  544.          If  not empty, newsreaders should copy this to the UMSCODE_Group
  545.        field  of  the  new  message  when  writing  a (public) follow-up.
  546.        Otherwise keep the old UMSCODE_Group field.
  547.  
  548.  
  549.          Same  format  as  for  field  UMSCODE_Group, except that, if the
  550.        author  of the public message thinks that public replies should go
  551.        into  several groups (as a "crossposting"), he may enter a list of
  552.        groups, seperated by commas, into this field.
  553.  
  554.  
  555.          Exception  to  all  of  this:  If this field contains the string
  556.        "poster", this expresses the poster's wish to get a private reply.
  557.        Newsreaders and similar UMS tools should behave accordingly.
  558.  
  559.  
  560.      19./20. UMSCODE_ReplyName/UMSCODE_ReplyAddress
  561.  
  562.          (Optional)  name  and address of the user private replies should
  563.        go to. Same purpose as "Reply-To:" in RFC822.
  564.  
  565.          If  not empty, newsreaders should copy these to the 'ToName' and
  566.        'ToAddress'-fields  of  the  new  message  when  writing a private
  567.        reply. Otherwise 'FromName' and 'FromAddress' should be used.
  568.  
  569.          Same format as for 'ToName' and 'ToAddress'.
  570.  
  571.  
  572.      21./22. UMSCODE_LogicalToName/UMSCODE_LogicalToAddress (V11)
  573.  
  574.          These  fields  are  needed  in UMS systems involved in automatic
  575.        mail distribution/forwarding, mailing lists e.g.
  576.  
  577.          Under  such  conditions,  it  may  be necessary to differenciate
  578.        between   "physical"   and  "logical"  addresses.  While  physical
  579.        addresses  describe  the  systems  messages are indeed transported
  580.        between,  logical  addresses  describe what origin and destination
  581.        the original author intended for his mail.
  582.  
  583.          If   these  fields  are  used,  the  fields  UMSCODE_ToName  and
  584.        UMSCODE_ToAddress contain the respective physical address.
  585.  
  586.          These fields are optional - and usually not needed.
  587.  
  588.  
  589.      23. UMSCODE_FileName (V11)
  590.  
  591.          (Optional) In a first attempt to encourage the support of binary
  592.        messages,  UMS  supports  the notion of "attached files". A binary
  593.        file  may  be attached to each message. If so, this field contains
  594.        the  logical  name  of  the attached file. No assumptions are made
  595.        concerning the style of the logical filename.
  596.  
  597.  
  598.      24. UMSCODE_RFCMsgNum (V11)
  599.  
  600.          Private field for an NNTP daemon service or UUNEWS: emulator.
  601.  
  602.  
  603.      32. UMSCODE_FidoText
  604.  
  605.          This is specific to FidoNet.
  606.  
  607.          It  should  thus  be  ignored  by  all programs not specifically
  608.        dealing  with  FidoNet. It's used by FidoNet drivers to avoid loss
  609.        of informa- tion due to conversions of eol-delimiters or charsets.
  610.  
  611.  
  612.      33. UMSCODE_ErrorText
  613.  
  614.          This  is  private  to  the MBP and a very special utility called
  615.        'bounce-daemon'.  It is used to transfer an error-text for writing
  616.        bounce-mails.  No  programs  except  of the 'bounce-daemon' should
  617.        deal with it.
  618.  
  619.  
  620.      34. UMSCODE_Newsreader
  621.  
  622.          (Optional)  name and version of the tool the message was created
  623.        with.  No specific format, but should be as small as possible. Not
  624.        more than one line.
  625.  
  626.  
  627.      35. UMSCODE_RfcAttr
  628.  
  629.          Private  field for RFC exporters. The user can supply additional
  630.        information or hints to the exporter.
  631.  
  632.  
  633.      36. UMSCODE_FtnAttr
  634.  
  635.          Private  field for FTN exporters. The user can supply additional
  636.        information or hints to the exporter.
  637.  
  638.  
  639.      37. UMSCODE_ZerAttr
  640.  
  641.          Private   field  for  Z-Netz  exporters.  The  user  can  supply
  642.        additional information or hints to the exporter.
  643.  
  644.  
  645.      38. UMSCODE_MausAttr
  646.  
  647.          Private field for Maus exporters. The user can supply additional
  648.        information or hints to the exporter.
  649.  
  650.  
  651.      127. UMSCODE_TempFileName (V11)
  652.  
  653.          (Optional) This tag is related to UMSCODE_FileName. If a file is
  654.        attached  to the message, this field contains the "temporary" name
  655.        of  the  attached  file.  It  has  only a local meaning and may be
  656.        different when reading and writing.
  657.          When  writing  the message, the client must supply the file with
  658.        this temporary filename and the MBP must be able to read it.
  659.          When  reading  the  message, the MBP supplies the name to a file
  660.        the client may read.
  661.          The  contents  of this field could be eqaul to UMSCODE_FileName,
  662.        but don't need to. Client as well as MBP have to use suitable path
  663.        in the filesystem, and specify the full pathname.
  664.  
  665. ums.library/--attributes--                         ums.library/--attributes--
  666.  
  667. ums.library/UMSCannotExport                       ums.library/UMSCannotExport
  668.  
  669.    NAME
  670.        UMSCannotExport -- Mark a message as not being exportable.
  671.  
  672.    SYNOPSIS
  673.        UMSCannotExport( login, msgNum, error )
  674.                          D2      D3     D4
  675.  
  676.        VOID UMSCannotExport( LONG, LONG, STRPTR );
  677.  
  678.    FUNCTION
  679.          Tell  the  MBP  that  you cannot export this message, due to any
  680.        reason.   The MBP will then look if other exporters still could be
  681.        able to export the message or do some error processing otherwise.
  682.          It may use the supplied error-string therein.  This error-string
  683.        should  be  a  short  description  why  the  message  could not be
  684.        exported.  By convention it should not be longer than 80 bytes.
  685.  
  686.    INPUTS
  687.        login  - Handle as returned by UMSLogin() or UMSRLogin()
  688.        msgNum - Number of the message.
  689.        error  - Short string (<80 chars).
  690.  
  691.    NOTES
  692.          This function may only be called by exporters.
  693.          The  MBP currently does not write a bounce mail to the author of
  694.        the  mail,  but  sets  a  special  global bit instead, which would
  695.        allows the 'bouncer' tool to automatically write bounce mails.
  696.  
  697.    SEE ALSO
  698.        UMSExportedMsg()
  699.  
  700. ums.library/UMSDeleteMsg                             ums.library/UMSDeleteMsg
  701.  
  702.    NAME
  703.        DeleteUMSMsg -- Delete a message.
  704.  
  705.    SYNOPSIS
  706.        success = DeleteUMSMsg( login, msgNum )
  707.          D0                     D2      D3
  708.  
  709.        BOOL DeleteUMSMsg( LONG, LONG);
  710.  
  711.    FUNCTION
  712.          This  functions deletes a message, specified by number, from the
  713.        UMS MB.
  714.          It does not necessarily free space on the hd, but it removes the
  715.        message  logically from the MB so that no other user can access it
  716.        anymore and it won't affect the dupe-check for new messages.
  717.          The  MBP  may need reorganization to physically remove logically
  718.        deleted messages.
  719.  
  720.    INPUTS
  721.        login   -  Handle as returned by UMSLogin() or UMSRLogin()
  722.        msgNum  -  Number  of  the  message to be deleted.  As returned by
  723.                   UMSSearch() or WriteUMSMsg().
  724.  
  725.    RESULT
  726.        success  -  Inidcates  whether the message was actually deleted or
  727.                    not.   It  will  be  not  deleted  if  you  don't have
  728.                    write-access  to  this  message or the message doesn't
  729.                    exist.
  730.  
  731.    NOTES
  732.          The  number of a message is valid only as long as you are logged
  733.        in.  After UMSLogout() messages numbers may change!
  734.          So  you  always  have  to  use the real Message-ID to remember a
  735.        message persistently.
  736.  
  737. ums.library/UMSDupAccount                           ums.library/UMSDupAccount
  738.  
  739.    NAME
  740.        UMSDupAccount -- share a login handle between processes
  741.  
  742.    SYNOPSIS
  743.        login = UMSDupAccount(login)
  744.        D0                      D2
  745.  
  746.        UMSAccount UMSDupAccount(UMSAccount);
  747.  
  748.    FUNCTION
  749.          UMSDupAccount()  allows  to  share  login  handles  to be shared
  750.        between different processes.
  751.          A  login  handle as returned by UMSRlogin() may onle be used the
  752.        the  same  process that obtained the login. If it wishes to shared
  753.        this  login  with  other processes, the handle has to be 'dupped':
  754.        the  login  handle  is passed to the new process, which may _only_
  755.        uses  this login with UMSDupAccount(). If successfull, a new login
  756.        handle is returned, which (only!) can be used by the new process.
  757.          This  procedure is required to manage process-specific resources
  758.        a  login handle may depend on. It does _not_ create a new login on
  759.        the  server.  Most likely, the server will not be involved in this
  760.        procedure at all, it's all done on the client side.
  761.          Each  process  must  UMSLogout()  all  login handles it obtained
  762.        either  from  UMSRLogin() or from UMSDupAccount(). The server only
  763.        notices a logout, when all login handles concerning that login are
  764.        closed  with UMSLogout(). Order or login and logout, however, does
  765.        not  matter. E.g. the first process may UMSLogout() and terminate,
  766.        while  the  new process ist still running and using a dupped login
  767.        handle.  Obviously  the  login handle has to be active at the time
  768.        UMSDupAccount()  is  invoked,  but  it  may  be  closed as soon as
  769.        UMSDupAccount() has returned.
  770.  
  771.    INPUTS
  772.        login - Handle as returned by UMSLogin() or UMSRLogin()
  773.  
  774.    RESULT
  775.        login  - Handle number if successful or Zero on failure
  776.  
  777.    SEE ALSO
  778.        UMSLogin(), UMSRLogin(), UMSLogout()
  779.  
  780. ums.library/UMSErrNum                                   ums.library/UMSErrNum
  781.  
  782.    NAME
  783.        UMSErrNum -- Return the number of the last error
  784.  
  785.    SYNOPSIS
  786.        error = UMSErrNum(login)
  787.        D0                D2
  788.  
  789.        UMSError UMSErrNum(UMSAccount);
  790.  
  791.    FUNCTION
  792.        UMS functions usually return zero to indicate an error. When this
  793.        happens,  this  routine may be called to get a more specific error
  794.        code. By some means, this routine corresponds to an UMS login as
  795.        dos.library/IoErr() does to a DOS-process.
  796.  
  797.        Possible UMS errors are:
  798.  
  799.         0      : No error at all, the last UMS function call was
  800.                  successful.
  801.  
  802.         100-199: A slight  error. The last functions call was not
  803.                  successful, but may succeed if some slight changes
  804.                  will be made to its parameters.
  805.  
  806.         200-299: A real error. The last function call was not successful
  807.                  at all and should not be retried.
  808.  
  809.         300-   : A severe error concerning the whole system, e.g.
  810.                  the server has terminated. A program receiving such
  811.                  an error is recommended to UMSLogout() and terminate
  812.                  as soon as possible.
  813.  
  814.    INPUTS
  815.        login - Handle as returned by UMSLogin() or UMSRLogin()
  816.  
  817.    RESULT
  818.        error - Error number
  819.  
  820.    SEE ALSO
  821.        UMSErrTxt()
  822.  
  823. ums.library/UMSErrTxt                                   ums.library/UMSErrTxt
  824.  
  825.    NAME
  826.        UMSErrTxt -- Return a string describing the last error
  827.  
  828.    SYNOPSIS
  829.        text = UMSErrTxt(login)
  830.        D0               D2
  831.  
  832.        STRPTR UMSErrTxt(UMSAccount);
  833.  
  834.    FUNCTION
  835.        When an UMS function fails and/or UMSErrNum() returns a nonzero
  836.        value,  you  should  use  this routine to get a brief English
  837.        description of the last error.
  838.  
  839.        Interactive  programs should  display  this  text  to the user.
  840.        Non-interactive programs should use this text in their logfile.
  841.  
  842.    INPUTS
  843.        login - Handle as returned by UMSLogin() or UMSRLogin()
  844.  
  845.    RESULT
  846.        text - Pointer to a constant string
  847.  
  848.    NOTES
  849.        This is similiar to dos.library/Fault(), but it doesn't copy any
  850.        string, it just returns a pointer.
  851.  
  852.        You may NEVER change the string returned by UMSErrTxt()!
  853.  
  854.    SEE ALSO
  855.        UMSErrNum(), UMSErrTxtFromNum()
  856.  
  857. ums.library/UMSErrTxtFromNum                     ums.library/UMSErrTxtFromNum
  858.  
  859.    NAME
  860.        UMSErrTxtFromNum -- Return a string describing the last error
  861.  
  862.    SYNOPSIS
  863.        text = UMSErrTxtFromNum(error)
  864.        D0                      D2
  865.  
  866.        STRPTR UMSErrTxtFromNum(UMSError);
  867.  
  868.    FUNCTION
  869.        When an UMS function not related to an UMSAccount returns an nonzero
  870.        value, you should use this routine to get a brief English description
  871.        of the last error.
  872.        Interactive programs should display this text to the user.
  873.        Non-interactive programs should use this text in their logfile.
  874.  
  875.    INPUTS
  876.        error - UMS error code
  877.  
  878.    RESULT
  879.        text - Pointer to a constant string
  880.  
  881.    NOTES
  882.        This is similiar to dos.library/Fault(), but it doesn't copy any
  883.        string, it just returns a pointer.
  884.  
  885.        You may NEVER change the string returned by UMSErrTxtFromNum()!
  886.  
  887.    SEE ALSO
  888.        UMSErrTxt()
  889.  
  890. ums.library/UMSExportedMsg                         ums.library/UMSExportedMsg
  891.  
  892.    NAME
  893.        UMSExportedMsg -- Mark a message as being successfully exported.
  894.  
  895.    SYNOPSIS
  896.        UMSExportedMsg( login, msgNum )
  897.                         D2      D3
  898.  
  899.        VOID UMSExportedMsg( LONG, LONG );
  900.  
  901.    FUNCTION
  902.          Tells  the  MBP  that  a message has been successfully exported.
  903.        The  MBP  uses  this  information  to prevent other exporters from
  904.        wrongly  exporting  this message a second time or writing a bounce
  905.        message.
  906.  
  907.          Every  exporter that exports a message from the local UMS system
  908.        to  any  other system or network MUST call either UMSExportedMsg()
  909.        or  UMSCannotExport()  for  each message it has processed. This is
  910.        valid  for private messages as well as for public messages (news).
  911.        The MBP will decide what has to be done in any of these cases.
  912.  
  913.    INPUTS
  914.        msgNum - Number of the exported message.
  915.  
  916.    NOTES
  917.          This function may only be called by exporters.
  918.  
  919.    SEE ALSO
  920.        UMSCannotExport()
  921.  
  922. ums.library/UMSFreeConfig                           ums.library/UMSFreeConfig
  923.  
  924.    NAME
  925.  
  926.        UMSFreeConfig - Free a string returned by UMSReadConfig()
  927.  
  928.    SYNOPSIS
  929.  
  930.        UMSFreeConfig( login, string)
  931.                        D2      D3
  932.  
  933.        void UMSFreeConfig( LONG, STRPTR );
  934.  
  935.    FUNCTION
  936.  
  937.        Frees the buffer allocated for a string and returned by
  938.        UMSReadConfig(). After 'UMSFreeConfig(string)', 'string' will no
  939.        longer be valid.
  940.  
  941.    INPUTS
  942.  
  943.        login  - Handle as returned by UMSLogin() or UMSRLogin()
  944.        string - string to be freed as returned by UMSReadConfig()
  945.  
  946.    SEE ALSO
  947.  
  948.        UMSReadConfig()
  949.  
  950. ums.library/UMSFreeMsg                                 ums.library/UMSFreeMsg
  951.  
  952.    NAME
  953.        UMSFreeMsg -- Free buffers associated with a certain message.
  954.  
  955.    SYNOPSIS
  956.        UMSFreeMsg( login, msgNum )
  957.                     D2      D3
  958.  
  959.        UMSFreeMsg( LONG, LONG );
  960.  
  961.    FUNCTION
  962.          Frees  all  the  buffers  associated  with  a  certain  message.
  963.        ReadUMSMsg() allocates the buffers, this function frees them.
  964.  
  965.    INPUTS
  966.        msgNum - number of the message previously read with ReadUMSMsg().
  967.  
  968.    NOTES
  969.          With  UMSFreeMsg()  all  STRPTRs obtained with ReadUMSMsg() that
  970.        are  concerned  with this certain message become invalid.  You can
  971.        have  multiple  ReadUMSMsg()  on  the  same  message  but only one
  972.        UMSFreeMsg().
  973.  
  974.    SEE ALSO
  975.        ReadUMSMsg()
  976.  
  977. ums.library/UMSLog                                         ums.library/UMSLog
  978.  
  979.    NAME
  980.        UMSLog -- Write an entry to the global UMS logfile
  981.  
  982.    SYNOPSIS
  983.        UMSLog(login, level, format, ...)
  984.               D2     D4     D5      D6
  985.  
  986.        void UMSLog(UMSAccount, LONG, STRPTR, ... );
  987.  
  988.        UMSVLog(login, level, format, args)
  989.                 D2    D4      D5     D6
  990.  
  991.        void UMSVLog(UMSAccount, LONG, STRPTR, APTR);
  992.  
  993.    FUNCTION
  994.        Write a short message to the UMS logfile, doing printf()-style
  995.        formatting on supplied parameters.
  996.  
  997.        Rather than creating its own logfile, an application should use
  998.        this function to report its actions and/or errors. This makes it
  999.        easier for the user to get an overview on what is happening in
  1000.        his system - he only has to look in ONE logfile.
  1001.  
  1002.        UMSLog()  uses  a 'level' parameter to decide whether a message
  1003.        should actually be written to the logfile or be ignored. The lower
  1004.        this number, the more important is the message. Choose it as follows:
  1005.  
  1006.          1-4: An ERROR.  1 = fatal error, 4 = recoverable error.
  1007.          5-7: General information or report.
  1008.          8-9: Information that is not useful for normal operation, but
  1009.               used for debugging purposes.
  1010.  
  1011.        Of course messages with high level values should appear more
  1012.        frequently than those with low level values.
  1013.  
  1014.    INPUTS
  1015.        login  - Handle as returned by UMSLogin() or UMSRLogin()
  1016.        level  - Number between 1 and 9
  1017.        format - printf()-style format string. See exec.library/RawDoFmt()
  1018.                 for more information on formatting.
  1019.        args   - Arguments for the format string
  1020.  
  1021.    SEE ALSO
  1022.        exec.library/RawDoFmt()
  1023.  
  1024. ums.library/UMSLogin                                     ums.library/UMSLogin
  1025.  
  1026.    NAME
  1027.        UMSLogin -- Obtain a login for access to the default message base
  1028.  
  1029.    SYNOPSIS
  1030.        login = UMSLogin(user, passwd)
  1031.        D0               D2    D3
  1032.  
  1033.        UMSAccount UMSLogin(STRPTR, STRPTR);
  1034.  
  1035.    FUNCTION
  1036.        This function does the same as UMSRLogin(), but you cannot specify
  1037.        the message base. The default message base will be used instead.
  1038.  
  1039.        New programs shouldn't use this function. Use UMSRLogin() so that
  1040.        the user may specify a message base.
  1041.  
  1042.    INPUTS
  1043.        user   - Name or 'alias' of an user
  1044.        passwd - The password of the user. A pointer to the null-string is
  1045.                 allowed, NULL itself isn't.
  1046.  
  1047.    RESULT
  1048.        login  - Handle number if successful or Zero on failure
  1049.  
  1050.  
  1051.    EXAMPLE
  1052.        UMSAccount login = UMSLogin("SysOp", "secret");
  1053.  
  1054.    NOTE
  1055.        Never forget to call UMSLogout()!
  1056.  
  1057.        New programs shouldn't use this function. Use UMSRLogin() so that
  1058.        the user may specify a message base.
  1059.  
  1060.    SEE ALSO
  1061.        UMSLogout(), UMSRLogin()
  1062.  
  1063. ums.library/UMSLogout                                   ums.library/UMSLogout
  1064.  
  1065.    NAME
  1066.        UMSLogout -- Close a login and free its resources
  1067.  
  1068.    SYNOPSIS
  1069.        UMSLogout(login)
  1070.                  D2
  1071.  
  1072.        void UMSLogout(UMSAccount);
  1073.  
  1074.    FUNCTION
  1075.        Close a login obtained with UMSRLogin() and free all related
  1076.        resources.
  1077.  
  1078.    INPUTS
  1079.        login - Handle as returned by UMSLogin() or UMSRLogin()
  1080.  
  1081.    SEE ALSO
  1082.        UMSLogin(), UMSRLogin()
  1083.  
  1084. ums.library/UMSMatchConfig                         ums.library/UMSMatchConfig
  1085.  
  1086.    NAME
  1087.        UMSMatchConfig -- Match a string against a config string.
  1088.  
  1089.    SYNOPSIS
  1090.        match = UMSMatchConfig( login, tags )
  1091.          D0                     D2     D3
  1092.  
  1093.        BOOL UMSMatchConfig( LONG, struct TagIten * );
  1094.  
  1095.        match = UMSMatchConfigTags( login, tag1, ... )
  1096.  
  1097.        BOOL UMSMatchConfigTags( LONG, ULONG, ... );
  1098.  
  1099.  
  1100.    FUNCTION
  1101.          UMS has its unique mechanism for pattern-matching, which is used
  1102.        by the MBP for determining different access-rights.
  1103.          UMSMatchConfig()  offer  direct  access to this pattern-matching
  1104.        mechanism,  including  positive  and  negatibe config variables. A
  1105.        taglist  is  used to specify the string to be macthed as well as a
  1106.        UMS configuriation string serving as a pattern.
  1107.  
  1108.    INPUTS
  1109.        The functions takes two mandatory tags:
  1110.  
  1111.          MatchString            : STRPTR
  1112.        specifies the string to be matched.
  1113.  
  1114.          MatchVarname           : STRPTR
  1115.        specifies the name of the UMS config string.
  1116.  
  1117.  
  1118.        And there are some optional tags:
  1119.  
  1120.          MatchGlobalOnly        : (none)
  1121.        only use a global config string.
  1122.  
  1123.          MatchUser              : STRPTR
  1124.        use  a config string local to another user. The name (or alias) of
  1125.        that user must be given.
  1126.  
  1127.          MatchDefault           : LONG
  1128.        a  value  that  will  be  returned, if the specified config string
  1129.        cannot be found, or any other type of error occurs.
  1130.  
  1131.    RESULT
  1132.        match - the result of the pattern matching. The value of tag
  1133.                MatchDefault or zero if an error occured.
  1134.  
  1135.    SEE ALSO
  1136.        UMSReadConfig()
  1137.  
  1138. ums.library/UMSReadConfig                           ums.library/UMSReadConfig
  1139.  
  1140.    NAME
  1141.        UMSReadConfig -- Read an element from UMS' configuration.
  1142.  
  1143.    SYNOPSIS
  1144.        string = UMSReadConfig( login, tags )
  1145.          D0                     D2     D3
  1146.  
  1147.        STRPTR UMSReadConfig( LONG, struct TagIten * );
  1148.  
  1149.        string = UMSReadConfigTags( login, tag1, ... )
  1150.  
  1151.        STRPTR UMSReadConfigTags( LONG, ULONG, ... );
  1152.  
  1153.  
  1154.    FUNCTION
  1155.        Read an object from UMS' configuration.
  1156.  
  1157.        Whenever possible, applications should use the UMS configuration
  1158.        (as stored in the file 'ums.config' in the directory of the
  1159.        message-base) and the supplied functions UMSReadConfig() and
  1160.        UMSWriteConfig() instead of own special config-files.
  1161.  
  1162.        A 'config-string' is a null-terminated string identified by an
  1163.        unique name. Similar to shell- and environment-variables
  1164.        config-strings can be global (same for all users) or local (only
  1165.        visible to a certain user).
  1166.  
  1167.        Other config-objects are 'users' (with aliases and local strings),
  1168.        'akas' and 'netgroups'.
  1169.  
  1170.        In order not to mix up config-strings of different applications,
  1171.        their names should have the id of the application and a dot
  1172.        prepended. E.g. "fido.outbound", "fido.inbound", "uucp.uuspool",
  1173.        "IntuiNews.QuoteChars.foo.bar", "ConfUMS.ForceDelete" etc.
  1174.  
  1175.        Names without a dot (".") are considered private strings of the
  1176.        MBP, e.g. "READACCESS", "WRITEACCESS".
  1177.  
  1178.        Names for config elements are case-insensitive.
  1179.  
  1180.        This function buffers the returned string until it is freed with
  1181.        UMSFreeConfig() or (UMSLogout()).
  1182.  
  1183.    INPUTS
  1184.        The following tags are allowed:
  1185.  
  1186.          CfgGlobalOnly         : (none)
  1187.        read just global config-elements, ignore local ones.
  1188.  
  1189.          CfgUser               : STRPTR
  1190.        read config elements local to another user. You must specify the
  1191.        name of the other user here. This contradicts CfgGlobalOnly (see
  1192.        above)!
  1193.  
  1194.          CfgLockVar        : LONG                      (V11)
  1195.        using this tag you may preserve the config
  1196.        string from being modified by another login, i.e. another UMS
  1197.        program. Set the tag's data to 1 if you want to do so, otherwise
  1198.        use 0 (or do not use this tag) to not lock the variable. Be
  1199.        careful to unlock the variable if you do not need it anymore using
  1200.        UMSWriteConfig()'s tags CfgUnlockVar! This tag is useful only in
  1201.        conjunction with CfgName (see below).
  1202.  
  1203.          CfgQuoted               : LONG              (V11)
  1204.        read the variable in quoted format, as used in "ums.config". This
  1205.        enables you to mix the variable's data with macros. Set the tag's
  1206.        data to 1 if you want to use the quoted format, otherwise set it
  1207.        to 0 (or do not use this tag).
  1208.  
  1209.  
  1210.        The following tags are mutually exclusive. Use exactly one of
  1211.        them.
  1212.  
  1213.        The CfgNext-tags allow you to scan all the existing elements of
  1214.        one type and do all work in the same manner: On first invocation
  1215.        you set the tag's data to NULL and get the first element. With
  1216.        every further call, you set it to what has been returned on the
  1217.        previous call. When NULL is returned, you're done.
  1218.  
  1219.          CfgName               : STRPTR
  1220.        read a config-string with given name.
  1221.  
  1222.          CfgUserName           : STRPTR
  1223.        get the 'realname' for a user with a given alias.
  1224.  
  1225.          CfgNextVar            : STRPTR
  1226.        get the name of the next config variable. This tag may be combined
  1227.        with tag CfgGlobalOnly or tag CfgUser (see above).
  1228.  
  1229.          CfgNextAlias          : STRPTR              (V11)
  1230.  
  1231.        get the next alias. This tags may be combined with CfgUser (see
  1232.        above)
  1233.  
  1234.          CfgNextUser           : STRPTR              (V11)
  1235.        get the 'realname' of the next user.
  1236.  
  1237.          CfgNextExporter       : STRPTR              (V11)
  1238.        get the name of the next export.
  1239.  
  1240.          CfgNextGroup          : STRPTR
  1241.  
  1242.        get the name of the next netgroup. Any number of groupnames may be
  1243.        configured as identical 'netgroups'. Use this tag to scan all
  1244.        netgroups, to scan their members use CfgNextGroupMember (see
  1245.        below).
  1246.  
  1247.          CfgNextGroupMember    : STRPTR              (V11)
  1248.        get the name of the next member of a specific netgroup. Using this
  1249.        tag repeatedly you can cycle trough all groups belonging to the
  1250.        same netgroup. Members of netgroups are organized in a circular
  1251.        structure, so you'll have to compare the original string with
  1252.        every result to determine whether you're done. NULL is returned
  1253.        only if the given string doesn't indicate a valid netgroup-member.
  1254.  
  1255.    RESULT
  1256.        string - a pointer to the desired config element or NULL.
  1257.  
  1258.    SEE ALSO
  1259.        UMSFreeConfig(), UMSWriteConfig()
  1260.  
  1261. ums.library/UMSReadMsg                                 ums.library/UMSReadMsg
  1262.  
  1263.    NAME
  1264.        UMSReadMsg -- Read (parts of) a message.
  1265.  
  1266.    SYNOPSIS
  1267.        success = UMSReadMsg( login, tags )
  1268.          D0                   D2     D3
  1269.  
  1270.        BOOL UMSReadMsg( LONG, struct TagItem * );
  1271.  
  1272.        success = UMSReadMsgTags( login, tag1, ... )
  1273.  
  1274.        BOOL UMSReadMsgTags( LONG, ULONG, ... );
  1275.  
  1276.    FUNCTION
  1277.          Read a message or any parts of it.
  1278.  
  1279.    INPUTS
  1280.          The following tags are allowed:
  1281.  
  1282.          RMsgNum               : LONG
  1283.                specify which msg to read. This tag MUST be used!
  1284.  
  1285.          RHeaderLength         : LONG *
  1286.                you have to pass a pointer to a LONG here.  This LONG will
  1287.        be  set  to  the length of the message-header in bytes.  I.e.  the
  1288.        length  of all text-fields considered to belong to the 'header' of
  1289.        a message.
  1290.  
  1291.          RTextLength           : LONG *
  1292.                like  RHeaderLength,  but  the length of the message-text.
  1293.        These are all other fields.
  1294.  
  1295.          RMsgDate              : LONG *
  1296.                the  date the message has been written to the message-base
  1297.        (also  referred  to  as  the  'receive-date').  In AmigaDOS Format
  1298.        (seconds since 1.1.1978).
  1299.  
  1300.          RChainUp,
  1301.          RChainDn,
  1302.          RChainLt,
  1303.          RChainRt              : LONG *
  1304.                reply-chaining.   Since  a  message  can only refer to one
  1305.        other  (older)  message,  but have multiple other (newer) messages
  1306.        referring  to  it, a tree is built out of this 'comment-chaining'.
  1307.        ChainUp  points to the referred message.  ChainDn points to one of
  1308.        the messages that comment on the current one.  ChainLt and ChainRt
  1309.        point to other messages which share the same ChainUp.
  1310.                The  LONG  you  supply a pointer to in the tag's data will
  1311.        either  be  set  to  zero  (when there is no such chain) or to the
  1312.        number of a message.
  1313.  
  1314.          RGlobalFlags          : LONGBITS *
  1315.                global  flags  for  this message.  In the MB every message
  1316.        has  exactly one set of global flags.  See <ums.h> for the meaning
  1317.        of these flags.
  1318.  
  1319.          RUserFlags            : LONGBITS *
  1320.                user-flags for this message.  Every user of the MB has one
  1321.        set  of user-flags for each message.  See <ums.h> for the fixed or
  1322.        suggested meanings of these flags.
  1323.  
  1324.          RLoginFlags           : LONGBITS *
  1325.                login-flags  for  this message.  Every login has a private
  1326.        set  of  flags  for  each  message.   In  contrast  to  global  or
  1327.        user-flags,  login-flags  are NOT saved and vanish on UMSLogout().
  1328.        They are set to zero on UMSLogin().
  1329.  
  1330.          RHardLink,
  1331.          RSoftLink             : LONG *
  1332.                a  pointer  to another link in the circular linked list of
  1333.        linked  messages.   Zero  if  a  real  message  (no  link).  Since
  1334.        message-links can be either hard or soft, but not both at the same
  1335.        time, only one of these can be non-zero.
  1336.  
  1337.          RDateStyle            : LONG
  1338.                use  this  tag and set its data to 1 if you want to get an
  1339.        old-style  'receive-date'.   Don't use this tag or set its data to
  1340.        zero otherwise.
  1341.  
  1342.          RMsgText, ..
  1343.          RMsgText + 127        : STRPTR *
  1344.                tell  UMS  that  you want to read the specified text-field
  1345.        and  supply a place for a pointer to it.  This will be set to NULL
  1346.        if  the  field  doesn't  exist  or  you're not allowed to read it.
  1347.  
  1348.          RTextFields           : UMSMsgTextFields
  1349.                if  you  supply  a pointer to an array of 128 STRPTR here,
  1350.        it  will  be  set  to  the read text-fields.  Useful for reading a
  1351.        whole  message  without  having to specify a tag for each possible
  1352.        text-field.
  1353.  
  1354.          RReadHeader           : (none)
  1355.                tell  UMS  that you want to read all header-field.  Useful
  1356.        in combination with RTextFields only.
  1357.  
  1358.          RReadAll              : (none)
  1359.                tell  UMS  that  you  want  to read the message-text, too.
  1360.        Useful in combination with RTextFields only.
  1361.  
  1362.  
  1363.        The following tag was not implemented in ums.library until V9.70 !
  1364.  
  1365.          RIDStyle              : LONG
  1366.                choose  the  style  of  local  message IDs.  There are two
  1367.        possible  formats of 'local' message IDs (= the IDs created by the
  1368.        local system):
  1369.  
  1370.                a)  a  simple  decimal  number that is unique on the local
  1371.        system
  1372.                b)  this  decimal  number  followed by "@" and the domain-
  1373.        address of the local system.  This conforms with RFC822/1036.
  1374.  
  1375.                Old  (obsolete) Version of ums.library (< V9.70) still use
  1376.        format a), but since V9.70 versions use format b) in order to make
  1377.        things cleaner and make life easier for exporters.  With format a)
  1378.        exporters  must  append the domain-address to IDs themselves, with
  1379.        format b) they needn't care about whether an ID is local or not.
  1380.  
  1381.                As  an  interim  solution  this  tag allows to specify the
  1382.        desired  format.  Its  data set to 1 forces format a), 0 (default)
  1383.        forces format b).
  1384.  
  1385.          RNoUpdate        : LONG
  1386.                when  reading  its  message-text,  a  message  is  usually
  1387.        updated  by having its 'Old'-flag set in your user-status.  If you
  1388.        don't  want  the Old-flag to be set, use this tag and set its data
  1389.        to 1.
  1390.  
  1391.    RESULT
  1392.        success  - whether your attempt to read the message was successful
  1393.                   or not.
  1394.  
  1395.    NOTES
  1396.          The  message  will  be  buffered,  so you can easily use all the
  1397.        returned  STRPTRs.   You  have  to  use  UMSFreeMsg()  to free the
  1398.        buffers allocated for a certain message.
  1399.          The string obtained by UMSReadMsg() are private copies for you -
  1400.        though  not  recommended, you may even overwrite them, but _never_
  1401.        beyond  the  teminating  zero-byte.  UMSFreeMsg()  still  wroks if
  1402.        strings are modified.
  1403.  
  1404.          An  user or exporter usually wants to read a single message only
  1405.        once.
  1406.          To  make  this  easy, UMSReadMsg() checks whether the user reads
  1407.        the 'MsgText' of a message, and, if so, sets the 'Old'-Flag in the
  1408.        users status if it wasn't already set.
  1409.          So the  user (or exporter) only needs to ask for this flag to be
  1410.        unset  when  using  'UMSSearch()'  before  'UMSReadMsg()' and will
  1411.        automatically avoid reading the same message a second time.
  1412.  
  1413.    SEE ALSO
  1414.        UMSFreeMsg(), UMSSearch()
  1415.  
  1416. ums.library/UMSRLogin                                   ums.library/UMSRLogin
  1417.  
  1418.    NAME
  1419.        UMSRLogin -- Obtain a login for access to a message base
  1420.  
  1421.    SYNOPSIS
  1422.        login = UMSRLogin(server, user, passwd)
  1423.        D0                D2      D3    D4
  1424.  
  1425.        UMSAccount UMSRLogin(STRPTR, STRPTR, STRPTR);
  1426.  
  1427.    FUNCTION
  1428.        This function is used to get access to an UMS message base. If
  1429.        necessary the UMSServer is launched first. ...
  1430.  
  1431.        This function returns a handle which is used internally to track
  1432.        and remember the resources associated with each login. If an user
  1433.        tries to login multiple times this handle will be different each
  1434.        time. A login may be used only by the process which created it
  1435.        UMSRLogin(). Zero on failure, any other value indicates success.
  1436.  
  1437.    INPUTS
  1438.        server - Name of the message base
  1439.        user   - Name or 'alias' of an user
  1440.        passwd - The password of the user. A pointer to the null-string is
  1441.                 allowed, NULL itself isn't.
  1442.  
  1443.    RESULT
  1444.        login  - Handle number if successful or Zero on failure
  1445.  
  1446.  
  1447.    EXAMPLE
  1448.        UMSAccount login = UMSRLogin("TestServer", "SysOp", "secret");
  1449.  
  1450.    NOTE
  1451.        Never forget to call UMSLogout()!
  1452.  
  1453.        Use this function instead of UMSLogin() for new programms.
  1454.  
  1455.    SEE ALSO
  1456.        UMSLogin(), UMSLogout()
  1457.  
  1458. ums.library/UMSSearch                                   ums.library/UMSSearch
  1459.  
  1460.    NAME
  1461.        UMSSearch -- Search a message from the MB.
  1462.  
  1463.    SYNOPSIS
  1464.        msgNum = UMSSearch( login, tags )
  1465.          D0                 D2     D3
  1466.  
  1467.        LONG UMSSearch( LONG, struct TagItem * );
  1468.  
  1469.        msgNum = UMSSearchTags( login, tag1, ... )
  1470.  
  1471.        LONG UMSSearchTags( LONG, ULONG, ... );
  1472.  
  1473.    FUNCTION
  1474.          Search  the  first  (or  next)  message  in  the MB that fulfils
  1475.        certain criteria.
  1476.  
  1477.          When  you  want  to  read  certain  messages  from the MB, it is
  1478.        recommended that you first select these  messages with UMSSelect()
  1479.        and  then  alternately  use  UMSSearch()  and UMSRead() to get all
  1480.        these messages.
  1481.  
  1482.    INPUTS
  1483.          Allowed tags:
  1484.  
  1485.          SearchLast            : LONG
  1486.                specify  the  last message NOT to search.  This tag allows
  1487.        you  to  cycle  trough all messages fullfilling the same criteria:
  1488.        set this to zero and invoke UMSSearch() the first time.  Check the
  1489.        result  and  if  it's  not  zero,  put  it  in this tag and invoke
  1490.        UMSSearch() again.  Repeat this until it returns zero.
  1491.  
  1492.          SearchDirection       : LONG
  1493.                set  the  search  direction.   1  means search forward (to
  1494.        higher  numbers), -1 means search backwards (to lower numbers) and
  1495.        0  lets  the  MBP  decide  what  sequence to use.  This needn't be
  1496.        exactly  forwards  or  backwards.   It  might  be  in a completely
  1497.        different order.
  1498.                When you don't depend on a certain search-direction, use 0
  1499.        or omit this tag.
  1500.  
  1501.          SearchGlobal          : (none)
  1502.          SearchLocal           : (none)
  1503.          SearchUser            : STRPTR
  1504.          SearchMask            : LONGBITS
  1505.          SearchMatch           : LONGBITS
  1506.                search   for   a   matching  status;  like  SelReadGlobal,
  1507.        SelReadLocal, SelReadUser, SelMask and SelMatch with UMSSelect().
  1508.  
  1509.          WMsgText, ..
  1510.          WMsgText + 127        : STRPTR
  1511.                search  for a matching text; as for UMSSelect().  Only one
  1512.        field can be searched for at a time.
  1513.  
  1514.          SearchQuick           : (none)
  1515.                Enable 'quick-search'.  This must be combined with exactly
  1516.        one  of  WMsgText+1  ..  WMsgText+31.  quick-searches are possible
  1517.        for  exact  string  searches  only, they must not be combined with
  1518.        patterns and they are only possible for fields that have an index.
  1519.                They  don't  guarantee  that  the returned message's field
  1520.        actually  matches  the  given  string,  altough  mistakes are very
  1521.        unlikely.
  1522.                But they are fast! (see NOTES below)
  1523.  
  1524.          SearchPattern         : LONG
  1525.                indicate whether the string to be searched for is an exact
  1526.        string  (0), an AmigaDOS pattern (1) or UMS should try to find out
  1527.        (2).
  1528.  
  1529.    RESULT
  1530.        msgNum - numer of a/the searched message; zero if not found.
  1531.  
  1532.    NOTES
  1533.          Although  LONGBITS  are  used  in  the  definition,  the current
  1534.        implementation only uses/supports the lower 16 bits.
  1535.  
  1536.          Performance:   when  searching  for  strings, different calls to
  1537.        UMSSearch()  may  significantly  vary  in  performance.  There are
  1538.        three general possibilities:
  1539.  
  1540.          1) quick-searches:
  1541.        very fast, no access to the hard-disk needed (once the right index
  1542.        is  loaded  into  memory).   Only  possible  if  tag 'SearchQuick'
  1543.        specified.
  1544.  
  1545.          2) indexed searches:
  1546.        fast,  in most cases only one, short access to hd is needed; a few
  1547.        more   in   really   bad  situations.   If  the  'header'-file  is
  1548.        sufficiently  buffered, no accesses to the hd may occur.  Possible
  1549.        if searching for exact strings in indexed fields.
  1550.  
  1551.          3) other searches (non-indexed or patterns):
  1552.        slow,  many  data  will  have  to  be  read from hd.  If the field
  1553.        searched for is in the 'header'-file and it's heavily buffered, no
  1554.        accesses  to  the  hd  may  occur.   Nevertheless  the search will
  1555.        consume much CPU-time.
  1556.  
  1557.          Search for status!!!
  1558.  
  1559.          Searching for a matching status only (i.e.  not searching for a
  1560.        string) is always very fast.
  1561.  
  1562.          When doing non-indexed- or pattern-search, combine with status
  1563.        to reduce the amount of data to be searched through!
  1564.  
  1565.    SEE ALSO
  1566.        UMSSelect(), ReadUMS(), <ums.h>
  1567.  
  1568. ums.library/UMSSelect                                   ums.library/UMSSelect
  1569.  
  1570.    NAME
  1571.        UMSSelect -- Select messages.
  1572.  
  1573.    SYNOPSIS
  1574.        count = UMSSelect( login, tags )
  1575.         D0                 D2     D3
  1576.  
  1577.        LONG UMSSelect( LONG, struct TagItem * );
  1578.  
  1579.        count = UMSSelectTags( login, tag1, ... )
  1580.  
  1581.        LONG UMSSelectTags( LONG, ULONG, ... );
  1582.  
  1583.    FUNCTION
  1584.          Select  messages  in  the  MB according to various criteria.  To
  1585.        'select'  here means to set or unset some flags, which then can be
  1586.        used by UMSSearch(), stored or transferred to another user.
  1587.  
  1588.          UMSSelect()  can  only  do  one operation upon every invocation.
  1589.        An  operation  usually  looks  for  all messages that fullfill the
  1590.        specified criteria and then selects them in a specified way.
  1591.  
  1592.          When  you  want  to  select  messages  by  different,  logically
  1593.        combined criteria, you may need to call UMSSelect() more than once
  1594.        and  use  some  temporary  flags.  However, very few calls to this
  1595.        functions usually should suffice.
  1596.  
  1597.    INPUTS
  1598.  
  1599.          The  following  tags  control  the selection of messages.  Thus,
  1600.        they somehow specify the 'output' of the select operation.
  1601.  
  1602.          SelWriteGlobal        : (none)
  1603.                manipulate global flags on the selected messages.
  1604.  
  1605.          SelWriteLocal         : (none)
  1606.                manipulate your local login-flags.
  1607.  
  1608.          SelWriteUser          : STRPTR
  1609.                manipulate another user's user-flags. You must specify the
  1610.        users name (or alias).
  1611.  
  1612.          SelWriteGlobal,   SelWriteLocal   and  SelWriteUser  are  mutual
  1613.        exclusive  --  you can  manipulate  only one flag-table at a time.
  1614.        When  specifying  none  of  these  tags,  your  user-flags will be
  1615.        manipulated as default.
  1616.  
  1617.          SelSet,
  1618.          SelUnset              : LONGBITS
  1619.                on  each selected message the 'SelUnset' flags are cleared
  1620.        and then the 'SelSet' flags are set.
  1621.        ['status = (status & ~unset) | set;']
  1622.                When writing global- or user-flags, you are not allowed to
  1623.        manipulate all possible flags.  See <ums.h> for protected flags.
  1624.  
  1625.  
  1626.          The  following  tags control what and how messages are selected,
  1627.        the 'input' and 'modes' of the select operation.
  1628.  
  1629.          SelStart,
  1630.          SelStop               : LONG
  1631.                Limit  the number of messages to be processed.  The select
  1632.        operation  will start with the message indicated by 'SelStart' and
  1633.        stop  before  the  'SelStop'  message.   In  other words, start is
  1634.        included  and  stop  is  excluded.
  1635.                (0 < start <= messages to be processed < stop)
  1636.                This  was different and partly buggy in MBP versions prior
  1637.        to V10.16.
  1638.                If  no  'SelStart' is specified, the operation starts with
  1639.        the  first  message;  if  no 'SelStop' is specified, the operation
  1640.        stops at the last existing message.
  1641.  
  1642.  
  1643.          The following seven operations are mutually exclusive:
  1644.  
  1645.        1) select by status
  1646.  
  1647.          SelReadGlobal         : (none)
  1648.          SelReadLocal          : (none)
  1649.          SelReadUser           : STRPTR
  1650.                like   SelWriteGlobal,  SelWriteLocal,  SelWriteUser,  but
  1651.        specifys  which  flags to look at.  Again, your user-flags are the
  1652.        default.
  1653.  
  1654.          SelMask,
  1655.          SelMatch              : LONGBITS
  1656.                specify  a  mask and a match.  If (status & mask) == match
  1657.        [status * mask = match], the message will be selected.
  1658.  
  1659.          SelParent             : (node)
  1660.               with   this   tag   specified,   each   message's  'parent'
  1661.        (reference;  ->  reply-chaining)  will be inspected instead of its
  1662.        own status.
  1663.  
  1664.        2) select by date
  1665.  
  1666.          SelDate               : LONG
  1667.                the  messages'  dates  are compared with the supplied date
  1668.        (in  seconds  since  1.1.1978)  and  only the younger ones will be
  1669.        selected.
  1670.  
  1671.        4) select a tree
  1672.  
  1673.          SelTree               : LONG
  1674.                you  must specify  the number of a message here.  Then all
  1675.        messages being in the same reply-tree will be selected.
  1676.  
  1677.        5) select a sub-tree
  1678.  
  1679.          SelSubTree            : LONG
  1680.                like  SelTree,  but  only  the  subtree  (the one with the
  1681.        specified message as its root) is selected.
  1682.  
  1683.        6) select a single message
  1684.  
  1685.          SelMsg                : LONG
  1686.                select only the specified message.
  1687.  
  1688.        7) select by text
  1689.  
  1690.          WMsgText, ..
  1691.          WMsgText + 127        : STRPTR
  1692.                when  you  specify one of these tags, the function selects
  1693.        all  messages  which  have  the  supplied  string in the specified
  1694.        field.  The strings are compared case-INsensitive.
  1695.  
  1696.          SelQuick              : (none)
  1697.                when  this tag is specified, 'quick-search' is enabled for
  1698.        selecting  texts.  This means that only some CRCs on the texts are
  1699.        compared.   This  makes  it  possible  to  select  also some wrong
  1700.        messages.   Yet,  due to the usage of 32-bit CRCs, the probability
  1701.        of  selecting  wrong  messages  is  VERY low, you most likely will
  1702.        never experience this case.
  1703.                As  'quick-search'  does  not usually need to access mass-
  1704.        storage, it is VERY FAST.
  1705.  
  1706.    RESULT
  1707.        count - how many messages have been selected.  Zero, when no
  1708.                message has been selected or an error has occured.
  1709.  
  1710.    EXAMPLE
  1711.          See SelectMail.c for examples on how to use this function.
  1712.  
  1713.    NOTES
  1714.          Although  LONGBITS  are  used  in  the  definition,  the current
  1715.        implementation only uses/supports the lower 16 bits.
  1716.  
  1717.    SEE ALSO
  1718.        UMSSearch(), <ums.h>
  1719.  
  1720. ums.library/UMSServerControl                     ums.library/UMSServerControl
  1721.  
  1722.    NAME
  1723.  
  1724.        UMSServerControl -- control the UMS server.
  1725.  
  1726.    SYNOPSIS
  1727.  
  1728.        error = UMSServerControl(server, action)
  1729.          D0                       D2     D3
  1730.  
  1731.        UMSError UMSServerControl (STRPTR, LONG);
  1732.  
  1733.    FUNCTION
  1734.          This  function  does  not  take an UMS account as parameter, but
  1735.        simply the name of the server to address and an integer number for
  1736.        the action to the server is expected to perform. It "annonymously"
  1737.        controls the global behaviour of the server.
  1738.  
  1739.          The following actions are available:
  1740.  
  1741.        1 = CleanUp
  1742.          Start   the   cleanup  procedure,  reorganizing  the  whole  MB,
  1743.        physically deleting deleted and expired messages and freeing space
  1744.        on  the  HD.  This  procedure  is  critical,  since the MB will be
  1745.        corrupted  if  the  procedure  is  interrupted (by system failure,
  1746.        power-off,  reboot,  ..).  Always  make of backup of the MB before
  1747.        starting a cleanup!
  1748.          A cleanup is not possible if there are valid logins, since all
  1749.        message-numbers are changed.
  1750.  
  1751.        2 = Flush
  1752.          Flush all buffers.
  1753.  
  1754.        3 = Quit
  1755.          Terminate  the  server.  If  there  still are logins, the server
  1756.        might pop up a requester to ask whether to quit or to continue,
  1757.  
  1758.        4 = QuitForce
  1759.          Really terminate the server, no matter how many users still need
  1760.        it. No requester.
  1761.  
  1762.        5 = Ping
  1763.          Test whether the addressed server is running.
  1764.  
  1765.        6 = LockCfg
  1766.          Globally lock the UMS configuration against changes.
  1767.  
  1768.        7 = UnlockCfg
  1769.          Release  a  lock  optained  with LockCfg. You should use LockCfg
  1770.        before and UnlockCfg after editing the file "ums.config" while the
  1771.        server is running.
  1772.  
  1773.    INPUTS
  1774.        server - name of the UMS server to control.
  1775.        action - no of action to perform.
  1776.  
  1777.    RESULT
  1778.        error - error number.
  1779.  
  1780.    SEE ALSO
  1781.        UMSErrTxt(), UMSErrNum()
  1782.  
  1783. ums.library/UMSWriteConfig                         ums.library/UMSWriteConfig
  1784.  
  1785.    NAME
  1786.  
  1787.        UMSWriteConfig -- Write an element to the UMS' configuration.
  1788.  
  1789.    SYNOPSIS
  1790.  
  1791.        success = UMSWriteConfig( login, tags )
  1792.          D0                       D2     D3
  1793.  
  1794.        BOOL UMSWriteConfig( LONG, struct TagIten * );
  1795.  
  1796.        success = UMSWriteConfigTags( login, tag1, ... )
  1797.  
  1798.        BOOL UMSWriteConfigTags( LONG, ULONG, ... );
  1799.  
  1800.  
  1801.    FUNCTION
  1802.  
  1803.        Create or modify elements of UMS' configuration.
  1804.  
  1805.    INPUTS
  1806.  
  1807.        The following tags are allowed:
  1808.  
  1809.        (Note: talking about a 'user' means exporters and sysops as well.)
  1810.  
  1811.        CfgData (STRPTR)
  1812.  
  1813.          this  tag's  data  holds  the  contents  of  the  variable to be
  1814.          written. Use this tag in conjunction with CfgName (see below).
  1815.  
  1816.        CfgUser (STRPTR)
  1817.  
  1818.          name  of  the  user whose local configuration should be changed.
  1819.          E.g.  create  a new alias or variable belonging to the specified
  1820.          user etc.
  1821.  
  1822.        CfgGlobalOnly (none)
  1823.  
  1824.          change  an  element  of  the  global  configuration  area  being
  1825.          readable by all users.
  1826.  
  1827.        CfgQuoted (LONG, V11)
  1828.  
  1829.          to  store  the variable's data in quoted format, allowing to mix
  1830.          the  data  and  macro  definitions,  set  the  tag's  data  to 1
  1831.          otherwise set it to 0 (or do not use this tag).
  1832.  
  1833.        CfgLocal (none, V11)
  1834.  
  1835.          use  this  tag to create or delete variables that are only valid
  1836.          with the current login, disappearing after UMSLogout(). This way
  1837.          you  can  easily use UMSMatchConfig() without actually modifying
  1838.          the "ums.config".
  1839.  
  1840.        CfgUnlockVar (STRPTR, V11)
  1841.  
  1842.          use   this   tag   to   unlock  a  variable  locked  by  calling
  1843.          UMSReadConfig() with the CfgLockVar tag allowing "public" access
  1844.          again.  Set the tag's data to 1 to unlock and store the variable
  1845.          and  its  data,  set it to 2 to just unlock the variable without
  1846.          actually  saving  it  and set it to 0 (or don't use this tag) to
  1847.          not care about the current locking state of the variable.
  1848.  
  1849.  
  1850.        The following tags are mutually exclusive. Use exactly one of them.
  1851.  
  1852.        CfgName (STRPTR)
  1853.  
  1854.          Name  of the config variable to be changed. If a variable of the
  1855.          given  name  does  not  exist  it  will  be created. To remove a
  1856.          variable  from  the  configuration  do not specify a tag CfgData
  1857.          (see above).
  1858.  
  1859.        CfgDump (STRPTR)
  1860.  
  1861.          write the current settings to a file with given name.
  1862.  
  1863.        CfgCreateAlias (STRPTR, V11)
  1864.  
  1865.          create  a  new alias of the given name for the user specified by
  1866.          the CfgUser tag (see above).
  1867.  
  1868.        CfgDeleteAlias (STRPTR, V11)
  1869.  
  1870.          remove  the  alias  of the given name from the user specified by
  1871.          the CfgUser tag (see above).
  1872.  
  1873.        CfgCreateExporter (STRPTR, V11)
  1874.  
  1875.          create a new export user with the given name.
  1876.  
  1877.        CfgCreateSysop (STRPTR, V11)
  1878.  
  1879.          create a new user with sysop-privilegs with the given name.
  1880.  
  1881.        CfgCreateUser (STRPTR, V11)
  1882.  
  1883.          create a new user with the given name.
  1884.  
  1885.        CfgDeleteUser (STRPTR, V11)
  1886.  
  1887.          remove  the  user  with  the  given  name from the configuration
  1888.          deleting her local variables as well.
  1889.  
  1890.        CfgAddNetGroup (STRPTR, V11)
  1891.        CfgNetGroup (STRPTR, V11)
  1892.  
  1893.          add a netgroup entry. These two tags must be used together, each
  1894.          naming one group. These two groups then are considered to the of
  1895.          the  same  "netgroup".  If there are more than two named for the
  1896.          same   netgroup,   repeat  this  function  for  each  additional
  1897.          groupname,  setting  CfgNetGroup  to  the  name  of  an  already
  1898.          existing group.
  1899.  
  1900.        CfgDeleteNetGroup (STRPTR, V11)
  1901.  
  1902.          delete  a  netgroup  entry. The named group will be removed from
  1903.          the configuration.
  1904.  
  1905.  
  1906.    RESULT
  1907.  
  1908.        success - whether it was possible and allowed to make the desired
  1909.                    write or change.
  1910.  
  1911.    SEE ALSO
  1912.  
  1913.        UMSReadConfig()
  1914.  
  1915. ums.library/UMSWriteMsg                               ums.library/UMSWriteMsg
  1916.  
  1917.    NAME
  1918.        UMSWriteMsg -- write a message to the UMS message base.
  1919.  
  1920.    SYNOPSIS
  1921.        msgNum = UMSWriteMsg( login, tags )
  1922.          D0                   D3     D3
  1923.  
  1924.        LONG UMSWriteMsg( LONG, struct TagItem * );
  1925.  
  1926.        msgNum = UMSWriteMsgTags( login, tag1, ... )
  1927.  
  1928.        LONG UMSWriteMsgTags( LONG, ULONG, ... );
  1929.  
  1930.    FUNCTION
  1931.          Writes  a message to the UMS message base.  This may be either a
  1932.        new  message  to  create  or  an  already  existing  message to be
  1933.        changed.
  1934.  
  1935.          The  MBP  checks  correctness  of  the  message  and  the  users
  1936.        write-access  concerning  this message before writing it.  It also
  1937.        performs  dupe-checking,  tries to link to a tree of reply-chains,
  1938.        creates   all  desired  indices  and  computes  the  other  users'
  1939.        read-access to this message.
  1940.          All  the components of the message as well as information on how
  1941.        to do it are supplied as AmigaDOS compatible TagItems.
  1942.  
  1943.    INPUTS
  1944.          The following tags are allowed:
  1945.  
  1946.          WMsgText, ..
  1947.          WMsgText + 127        : STRPTR
  1948.                specify a certain text-field.
  1949.                A  text fields is always one null-terminated string.  Read
  1950.        the  separate documantation to see what fields and what formats of
  1951.        these fields are allowed.
  1952.                A  certain  text-field  (identified  by  its tag) may only
  1953.        appear  once in a message.  If a field is specified more than once
  1954.        in the tag list, only the latest will be used.
  1955.  
  1956.          WTextFields           : UMSMsgTextFields
  1957.                specify more than one text-field.  This points to an array
  1958.        of 128 string-pointers.  All fields you don't want to specify must
  1959.        be NULL in this array.
  1960.  
  1961.  
  1962.          WMsgNum               : LONG
  1963.                when  you want to change an old message, you must use this
  1964.        tag  to  specify  the  number of the message to change.  Don't use
  1965.        this tag when you just want to create a new message.
  1966.  
  1967.          WMsgDate              : LONG
  1968.                this  has  a very special meaning.  Specifying an AmigaDOS
  1969.        compatible  date  (seconds since 1.1.1978) with this tag indicates
  1970.        that you  want to restore an old message from a backup rather than
  1971.        writing a new one.  All users will have the 'old' flag set and not
  1972.        get this message as a new one when this tag is used.
  1973.  
  1974.        WChainUp                : LONG
  1975.                in some cases it might be unsure or impossible for the MBP
  1976.        to  build  the correct reply-chain for a message.  Use this tag to
  1977.        specify  the  number of the old message that is referred to by the
  1978.        new one.
  1979.  
  1980.        WHardLink,
  1981.        WSoftLink               : LONG
  1982.                Writing a message with a Message-ID that already exists in
  1983.        the  MB  usually  will  lead to the detection of a 'dupe'.  Yet in
  1984.        some cases it is necessary for UMS to allow multiple messages with
  1985.        the  same  Message-ID.
  1986.                This  is  made possible by the concept of message-'links'.
  1987.        With  this  concept, multiple messages sharing the same Message-ID
  1988.        (and  perhaps some more fields) are organized in a circular linked
  1989.        list.   To  create  such  a  linked list, you just write its first
  1990.        message  as  usual  and  remember  its number.  Then you write the
  1991.        other  messages  using one of the above tags to specify the number
  1992.        of the original message (or any of the already linked messages).
  1993.                The  MBP  may  optimize storage space for message links by
  1994.        only  storing  the  fields  that differ between the fields and the
  1995.        original  message.   Nevertheless  you  always have to specify the
  1996.        whole message to write a link and you will always get the complete
  1997.        message when reading a link.
  1998.                All  links to a message must consist of the same fields as
  1999.        the original message, but the contents of the fields may differ.
  2000.  
  2001.                There  are  two  sorts  of  message-links,  hardlinks  and
  2002.        softlinks.  Softlinks  describe  messages that have some fields in
  2003.        common  (at  least  MsgID),  but  are really treated as individual
  2004.        messages. E.g. a mail with multiple receipients. Hardlinks, on the
  2005.        other  hand, are treated as one message wherever possible. I.e. if
  2006.        you  read  one  hardlinked  message,  all  the other links will be
  2007.        marked  as  old,  too.  RFC crosspostings, for instance, should be
  2008.        made hardlinks.
  2009.  
  2010.        WAutoBounce             : LONG
  2011.                If the msg to be written is addressed to a local user that
  2012.        doesn't  exist or to an address that no exporter can export, there
  2013.        are two possible behaviours possible for the MBP:
  2014.                a) reject the message using error-no "NoReader", expecting
  2015.        the client to care about the undeliverable message
  2016.                b)  keep  the message, forwarding it to the local sysop or
  2017.        some kind of 'bounce-daemon', so that the writing client needs not
  2018.        to care about the message any more.
  2019.                This  tag allowes to specify the desired behaviour, data=0
  2020.        forces  a),  data=1  forces b).  If this tag is not specified, the
  2021.        MBP  will  choose  the  behaviour as it wishes, maybe depending on
  2022.        whether the writing user is an exporter or not.
  2023.  
  2024.        WHide                   : LONG
  2025.                In  some  cases  it  might be desirable to write a message
  2026.        that can only by read by exporters and not by simple users, or the
  2027.        other way round.
  2028.                For  instance  control-messages that are of no interest to
  2029.        users by must be distributed over the net.
  2030.                Setting data to 0 is the same as the default. data=1 means
  2031.        that  only  exporters  may view and read the message, data=2 makes
  2032.        the  message  invisible to exporters and only accessible to simple
  2033.        users.
  2034.  
  2035.        WHdrFill,
  2036.        WTxtFill                : LONG
  2037.                specify how many bytes to reserve for later changes in the
  2038.        header/text of the message.
  2039.                The  MBP  may not be able to change an existing message if
  2040.        the   change   would   increase  the  overall  size  (maybe  after
  2041.        compression) of the message.  Since such changes are neccessary in
  2042.        some special cases, the MBP can be told to reserve some space when
  2043.        writing a message the first time.
  2044.  
  2045.                Reserving  more  than  actually needed is not a good idea,
  2046.        since  it decreases performance and wastes space.  The writer of a
  2047.        message  usually  should  know  whether  or not he will change the
  2048.        message  later on  and to what extend he will increase the size of
  2049.        the message.
  2050.  
  2051.          WNoUpdate        : LONG
  2052.                when writing a message, the 'Old'-flag in your user-status
  2053.        for  the  new message will usually be set. If you don't want this,
  2054.        use this tag and set its data to 1.
  2055.  
  2056.          WCheckHeader          : LONG
  2057.                if  you  just  want  to check whether the MBP would likely
  2058.        accept  a  message but you don't yet have the complete body of the
  2059.        message,  you  can  use this tag und set its data to 1: nothing is
  2060.        actually  written  to the MB. If the supplied message-header seems
  2061.        to be ok, -1 will be returned as a "fake" message number. Then you
  2062.        can  get  the  messages body (e.g. transfer it over a network) and
  2063.        write  the message with removing this tag of just setting its data
  2064.        to 0.
  2065.  
  2066.    RESULT
  2067.        msgNum - Number of the written message or NULL on failure.
  2068.  
  2069.    NOTES
  2070.                Changing an old message:
  2071.  
  2072.                You   must   _always_   give   a   complete   message   to
  2073.        UMSWriteMsg(),  even when changing an old one!  The MBP needs this
  2074.        to  detect all changes made to the old message, including changed,
  2075.        added or deleted fields.  Thus you need to read a message prior to
  2076.        changing  it.  Use RTextFields and WTextField for UMSReadMsg() and
  2077.        UMSWriteMsg()  when  changing  an old message!  Otherwise you will
  2078.        loose  fields  unknown  to  you  allication  that  might  be still
  2079.        important to other applications!
  2080.  
  2081.                You  may  not  be  allowed  to change certain fields of an
  2082.        existing  message.   Most likely those fields that are used by the
  2083.        MBP  to  compute all the users access-rights will be prohibited to
  2084.        change.
  2085.  
  2086.